//
//  MMGHomeViewController.swift
//  MyMicroblog
//
//  Created by Mac on 17/1/4.
//  Copyright © 2017年 itcast. All rights reserved.
//

import UIKit

private let originateCellID: String = "homePageOriginateCellID"
private let retweetedCellID: String = "homePageRetweetedCellID"
class MMGHomeViewController: MMGTablePlainController {
    
   // 控制器拥有视图模型,获取视图模型方法
    // 懒加载视图模型控制者
    lazy var homeViewModel:MMGHomePageViewModel = MMGHomePageViewModel()
    // 懒加载下拉刷新控件
    lazy var pullDownControl:MMGRefreshControl = MMGRefreshControl()
        
    override func viewDidLoad() {
        super.viewDidLoad()

        navigationItem.rightBarButtonItem = UIBarButtonItem(imageName: "navigationbar_pop", imageNameSel: "navigationbar_pop_highlighted", title: nil, target: self, action: #selector(pushToOther))
        
        visitorView.updataInfo(imageName: nil, tipTitle: nil, isHome: true)
        
//        // 为上拉刷新控件添加监听方法
//        self.refreshControl.addTarget(self, action: #selector(loadData), for: UIControlEvents.valueChanged)
        
        // 搭建界面
        setupUI()
        // 加载数据
        loadData()
    }
    
    // 加载数据
    func loadData() {
        // 获取加载状态,确定要执行的 UI 操作
        homeViewModel.loadData(isPullUp: indicatorView.isAnimating) { (isSuccessed,count) in
            // 如果加载成功,执行刷新界面,执行提醒动画
            if !isSuccessed {
                return
            }
            // 停止小梅花的动画效果
            self.indicatorView.stopAnimating()
            // 停止上拉控件动画
//            self.refreshControl.endRefreshing()
            self.pullDownControl.endFreshing()
            // 加载成功后开始执行提示动画
            self.startAnimation(count: count)
            // 刷新界面
            self.tableView.reloadData()
        }
    }
    
    // 搭建 UI 界面
    func setupUI() {
        // 获取 cell 的 nibName
        let originateNib = UINib(nibName: "MMGHomePageCell", bundle: nil)
        let retweetedNib = UINib(nibName: "MMGHomePageRetweetedCell", bundle: nil)
        // 注册 cell
        tableView.register(originateNib, forCellReuseIdentifier: originateCellID)
        tableView.register(retweetedNib, forCellReuseIdentifier: retweetedCellID)
        // 设置单元格高度
        tableView.separatorStyle = .none
        // 设置表尾
        tableView.tableFooterView = indicatorView
        // 添加 tipLabel 置于导航条下
        tipLabel.frame = CGRect(x: 0, y: navBarHeight - 35, width: ScreenWidth, height: 35)
        navigationController?.view.insertSubview(tipLabel, belowSubview: (navigationController?.navigationBar)!)
        // 将下拉刷新控件加载到表视图中
        tableView.addSubview(pullDownControl)
        // 调整 刷新控件 的位置
        pullDownControl.frame.origin.y = -navBarHeight
        // 监听下拉刷新事件
        pullDownControl.addTarget(self, action: #selector(loadData), for: UIControlEvents.valueChanged)
    }
    
    // 提供动画方法
    private func startAnimation(count: Int) {
        // 判断是否在做动画,如果做动画,则直接返回,否则执行
        if tipLabel.isHidden == false {
            return
        }
        // 设置文字
        let tipText = count == 0 ? "没有新消息鸟🐦🐦🐦" : "新增\(count)条微博"
        tipLabel.text = tipText
        // 显示 tipLabel
        tipLabel.isHidden = false
        // 开始动画
        // 记录 tipLabel 坐标 Y 的位置
        let y = tipLabel.frame.minY
        UIView.animate(withDuration: 1, delay: 0.25, options: [], animations: {
            // 使 tipLabel 出现,并可见
            self.tipLabel.frame.origin.y = navBarHeight
        }, completion: { (_) -> () in
            // 结束动画, tipLabel 返回,隐藏
            UIView.animate(withDuration: 1, delay: 1, options: [], animations: {
                self.tipLabel.frame.origin.y = y
            }, completion: {(_) -> () in
                self.tipLabel.isHidden = true
            })
        })
    }
    
    // 懒加载新闻提示label
    lazy var tipLabel: UILabel = {
        // 初始加载,没有文字,隐藏label
        let v = UILabel(text: "", textColor: UIColor.white, textFontSize: 16)
        v.backgroundColor = UIColor.orange
        v.textAlignment = .center
        v.isHidden = true
        return v
    }()
    
    // 懒加载获取加载梅花指示器
    internal lazy var indicatorView: UIActivityIndicatorView = {
        let indicator =  UIActivityIndicatorView(activityIndicatorStyle: .gray)
        return indicator
    }()
    
    // 跳转
    @objc private func pushToOther() {
        self.navigationController?.pushViewController(MMGBaseViewController(), animated: true)
    }
}


/********** 在分类中实现刷新 UI 效果 **********/
extension MMGHomeViewController {
    
}

/********** 在分类中重写 tableView 的数据源方法 **********/
extension MMGHomeViewController {
    // 实现数据源方法
    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        
        return self.homeViewModel.viewModelArr.count
    }
    
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        // 获取视图模型,拿到 cell 模型,为 cell 的模型赋值
        let viewModel = self.homeViewModel.viewModelArr[indexPath.row]
        let cellID = self.getCellID(viewModel: viewModel)
        let cell = tableView.dequeueReusableCell(withIdentifier: cellID, for: indexPath) as! MMGHomePageCell
        cell.viewModel = viewModel
        return cell
    }
    
    // 实现代理方法,设置单元格高度   tableView 在调用重用单元格时,会调用此方法,所以,在获取单元格时不能使用重用方法
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        // 获取视图模型,拿到 cell 模型,为 cell 的模型赋值
        let viewModel = self.homeViewModel.viewModelArr[indexPath.row]
        let nibName = self.nibName(viewModel: viewModel)
        let cell = UINib(nibName: nibName, bundle: nil).instantiate(withOwner: nil, options: nil).last as! MMGHomePageCell
        cell.viewModel = viewModel
        cell.layoutIfNeeded()
        return cell.bottomToolView.frame.maxY
    }
    
    // 重写单元格显示方法
    func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        // 判断显示状态,如果显示的是最后两个,并且加载指示器处于非动画状态,则开始准备加载数据
        if (indexPath.row == self.homeViewModel.viewModelArr.count - 2) && (self.indicatorView.isAnimating == false) {
            self.indicatorView.startAnimating()
            self.loadData()
        }
    }
    
    // 处理单元格获取 nib 名称
    private func nibName(viewModel: MMGStatusViewModel) -> String {
        return viewModel.status?.retweeted_status == nil ? "MMGHomePageCell" : "MMGHomePageRetweetedCell"
    }
    
    // 处理单元格重用标识符
    private func getCellID(viewModel: MMGStatusViewModel) -> String{
        return viewModel.status?.retweeted_status == nil ? originateCellID : retweetedCellID
    }
}
